如何使用 Spring Data Neo4j 5 存储库检索路径
How to retrieve a path with Spring Data Neo4j 5 repository
我在 neo4j 中建模了一个简单的有限状态机图,其中域由 State
实体和 FOLLOWED_BY
关系组成(密码:(s1:State)-[r:FOLLOWS]->(s2:State)
)。
每个都有一些属性。我现在需要分析各州之间的关系,不知道 return 是怎么输入的
存储库界面应该是这样的。
实体和关系的(缩短的)代码 classes(带有 lombok 注释):
@NodeEntity
@NoArgsConstructor
public class State {
@Getter
private String name;
@Getter
private String inputVariable;
@Getter
private String outputVariable;
}
@RelationshipEntity(type = "FOLLOWED_BY")
@NoArgsConstructor
public class Transition implements FlowTransition {
@Getter
@Property
private String guard;
@Getter
@StartNode
private State sourceState;
@Getter
@EndNode
private State targetState;
}
对于一些分析,从一个状态到后续状态存在哪些路径,其中第一个状态的输出变量用作
以下状态的输入变量,我需要查询中的路径return。因为我正在使用 SDN,所以我想拥有它
return从存储库中输入(自定义)查询。
@Repository
public interface StateRepository extends Neo4jRepository<State, Long> {
@Query("MATCH p=allShortestpaths((s1:State)-[r:FOLLOWED_BY*1..200]->(s2:State))"
+ " WHERE s1.outputVariable = s2.inputVariable AND id(s1) = {eId}"
+ " RETURN p)"
??? findAllByBpelPathRegEx(@Param("eId") String startId);
}
我的问题是:我应该使用什么 class 作为 return 类型来获取路径对象? EntityPath
或EndResult
在SDN5中似乎已经不存在了(也许还有4),那怎么办?也许是预测,但它们看起来应该像什么?
从这个问题和答案 如何在 spring data neo4j 4 中查询路径?
:
EntityPath
自 SDN 4 以来不受支持,您应该使用 Iterable<Map<String, Object>>
作为 return 类型(顺便说一句:List<Map<String, Object>>
也可以)。 Map<String, Object>
的键是您在 Cypher 查询中 return 的变量名称(在示例中,它是 RETURN p
中的 p
)。
顺便说一句:你 return RETURN nodes(p) AS nodes, relationships(p)
(映射键:nodes
,relationships(p)
)可能更好,因为这会 return 你定义的 @NodeEntity
和 @RelationshipEntity
对象,而不仅仅是简单的路径对象(仅包含 id(作为字符串)而不是节点对象本身)
您可以在对象中获取结果 class 或者您需要创建一个 class 具有 @QueryResult 注释的对象来收集 s1 和 s2。
我在 neo4j 中建模了一个简单的有限状态机图,其中域由 State
实体和 FOLLOWED_BY
关系组成(密码:(s1:State)-[r:FOLLOWS]->(s2:State)
)。
每个都有一些属性。我现在需要分析各州之间的关系,不知道 return 是怎么输入的
存储库界面应该是这样的。
实体和关系的(缩短的)代码 classes(带有 lombok 注释):
@NodeEntity
@NoArgsConstructor
public class State {
@Getter
private String name;
@Getter
private String inputVariable;
@Getter
private String outputVariable;
}
@RelationshipEntity(type = "FOLLOWED_BY")
@NoArgsConstructor
public class Transition implements FlowTransition {
@Getter
@Property
private String guard;
@Getter
@StartNode
private State sourceState;
@Getter
@EndNode
private State targetState;
}
对于一些分析,从一个状态到后续状态存在哪些路径,其中第一个状态的输出变量用作 以下状态的输入变量,我需要查询中的路径return。因为我正在使用 SDN,所以我想拥有它 return从存储库中输入(自定义)查询。
@Repository
public interface StateRepository extends Neo4jRepository<State, Long> {
@Query("MATCH p=allShortestpaths((s1:State)-[r:FOLLOWED_BY*1..200]->(s2:State))"
+ " WHERE s1.outputVariable = s2.inputVariable AND id(s1) = {eId}"
+ " RETURN p)"
??? findAllByBpelPathRegEx(@Param("eId") String startId);
}
我的问题是:我应该使用什么 class 作为 return 类型来获取路径对象? EntityPath
或EndResult
在SDN5中似乎已经不存在了(也许还有4),那怎么办?也许是预测,但它们看起来应该像什么?
从这个问题和答案 如何在 spring data neo4j 4 中查询路径? :
EntityPath
自 SDN 4 以来不受支持,您应该使用 Iterable<Map<String, Object>>
作为 return 类型(顺便说一句:List<Map<String, Object>>
也可以)。 Map<String, Object>
的键是您在 Cypher 查询中 return 的变量名称(在示例中,它是 RETURN p
中的 p
)。
顺便说一句:你 return RETURN nodes(p) AS nodes, relationships(p)
(映射键:nodes
,relationships(p)
)可能更好,因为这会 return 你定义的 @NodeEntity
和 @RelationshipEntity
对象,而不仅仅是简单的路径对象(仅包含 id(作为字符串)而不是节点对象本身)
您可以在对象中获取结果 class 或者您需要创建一个 class 具有 @QueryResult 注释的对象来收集 s1 和 s2。